import os
import shutil
from pathlib import Path
from argparse import ArgumentParser

def is_photo_file(filename):
    """判断给定的文件是否为视频文件"""
    image_extensions = {'.jpg', '.jpeg', '.png','.aae','.heic','.thm', '.gif', '.bmp', '.tiff', '.webp'}
    return Path(filename).suffix.lower() in image_extensions

def is_video_file(filename):
    """判断给定的文件是否为视频文件"""
    video_extensions = {'.mp4', '.avi', '.mkv', '.mov', '.wmv', '.flv','.mts','.mpeg','.rm', '.webm','.3gp','.mp3','.wav','.f4v','.m4a','.mpg','.rmvb','.vob'}
    return Path(filename).suffix.lower() in video_extensions


def move_all_others(src_base_folder, dest_base_folder):
    """
    扫描 src_base_folder 及其子目录，找到所有 *.zip 文件，
    在 dest_base_folder 下创建与原 *.zip 文件所在目录同名的文件夹，
    并将 *.zip 移动到该文件夹中。
    """
    # 遍历源目录及其子目录
    for root, dirs, files in os.walk(src_base_folder):
        for file in files:
            if not is_photo_file(file) and not is_video_file(file):
                # 完整路径
                full_file_path = os.path.join(root, file)
                
                # 计算相对路径（去掉src_base_folder部分）
                rel_path = os.path.relpath(root, src_base_folder)
                
                # 创建目标文件夹路径（在dest_base_folder下创建与原目录结构相同的目录）
                dest_dir = os.path.join(dest_base_folder, rel_path)
                
                # 如果目标目录不存在，则创建它
                os.makedirs(dest_dir, exist_ok=True)
                
                # 目标文件的新路径
                dest_file_path = os.path.join(dest_dir, file)
                
                try:
                    # 移动文件
                    shutil.move(full_file_path, dest_file_path)
                    print(f"已将文件 {full_file_path} 移动到 {dest_file_path}")
                except Exception as e:
                    print(f"移动文件时出错: {e}")
            

def main():
    parser = ArgumentParser(description="扫描指定目录下的所有非图片和视频文件，并将其移动到指定的目标目录")
    parser.add_argument('--src-dir', required=True, help='要扫描的源目录')
    parser.add_argument('--des-dir', required=True, help='目标目录')

    args = parser.parse_args()

    src_base_folder = args.src_dir
    dest_base_folder = args.des_dir
    
    if not os.path.isdir(src_base_folder):
        print(f"Error: 源目录 {src_base_folder} 不存在或不是一个目录")
        return
    
    if not os.path.isdir(dest_base_folder):
        print(f"Error: 目标目录 {dest_base_folder} 不存在或不是一个目录")
        return
    
    move_all_others(src_base_folder, dest_base_folder)

if __name__ == "__main__":
    main()